<?php

use App\ConstDir\BaseConst;

if (!function_exists('config_path')) {
    /**
     * Get the configuration path.
     *
     * @param string $path
     * @return string
     */
    function config_path($path = '')
    {
        return app()->basePath() . '/config' . ($path ? '/' . $path : $path);
    }
}

/**
 * 获取值
 *
 * 1) 两个参数 第一个为参数 第二个为默认值
 * 2) 三个参数 数组或对象 第一个为参数 第二个为键 第三个为默认值
 * 3) 四个参数 数组或对象 第一个为参数 第二个为键 第三个为默认值 第四个为回调函数意在对结果进行进一步处理
 *
 * @param $_data
 * @param $_key
 * @param null $_default_value
 * @return mixed|null
 */
if (!function_exists('get_value')) {
    function get_value()
    {
        $args = func_get_args();
        $value = null;
        switch (count($args)) {
            case 2:
                //单一变量
                list($_data, $_default_value) = $args;
                $value = $_default_value;
                if (!is_null($_data)) {
                    $value = $_data;
                }
                break;
            case 3:
                //数组或对象
                list($_data, $_key, $_default_value) = $args;
                $value = $_default_value;
                if (is_array($_data)) {
                    if (isset($_data[$_key])) {
                        $value = $_data[$_key];
                    }
                } elseif (is_object($_data)) {
                    if (property_exists($_data, $_key)) {
                        $value = $_data->$_key;
                    }
                }
                break;
            case 4:
                //数组或对象+回调函数
                list($_data, $_key, $_default_value, $_closure) = $args;
                $value = $_default_value;
                if (is_array($_data)) {
                    if (isset($_data[$_key])) {
                        $value = $_data[$_key];
                    }
                } elseif (is_object($_data)) {
                    if (property_exists($_data, $_key) || isset($_data->$_key)) {
                        $value = $_data->$_key;
                    }
                }
                if ('Closure' == get_class($_closure)) {
                    $value = $_closure($value);
                }
                break;
        }

        return $value;

    }
}

/**
 * 获取本地存储路径
 */
if (!function_exists('storage_path')) {
    function storage_path($_path = '')
    {
        return ROOT_PATH . 'storage/' . $_path;
    }
}

if (!function_exists('_pre')) {
    function _pre(\Closure $closure)
    {
        if (!IS_CLI)
            echo '<pre>';
        $closure();
        if (!IS_CLI)
            echo '</pre>';
    }
}
if (!function_exists('_v')) {
    function _v()
    {
        $args = func_get_args();
        _pre(function () use ($args) {
            call_user_func_array('var_dump', $args);
        });
    }
}
if (!function_exists('_p')) {
    function _p()
    {
        $args = func_get_args();
        _pre(function () use ($args) {
            call_user_func_array('print_r', $args);
        });
    }
}

if (!function_exists('get_property')) {
    function get_property($obj, $property, $default = null)
    {
        if (!$obj) return $default;
        is_string($obj) and $obj = json_decode($obj, true);
        if (is_object($obj)) {

            return property_exists($obj, $property) || isset($obj->$property) ? $obj->$property : $default;
        }

        return isset($obj[$property]) ? $obj[$property] : $default;
    }
}

if (!function_exists('sub_str')) {
    /**
     * 截取UTF-8编码下字符串的函数
     *
     * @param string $str 被截取的字符串
     * @param int $length 截取的长度
     * @param bool $append 是否附加省略号
     *
     * @return  string
     */
    function sub_str($str, $length = 0, $append = true)
    {
        $str = str_replace("\n", '', str_replace("\r", '', trim($str)));
        $strlength = strlen($str);

        if ($length == 0 || $length >= $strlength) {
            return $str;
        } elseif ($length < 0) {
            $length = $strlength + $length;
            if ($length < 0) {
                $length = $strlength;
            }
        }

        if (function_exists('mb_substr')) {
            $newstr = mb_substr($str, 0, $length, 'utf-8');
        } elseif (function_exists('iconv_substr')) {
            $newstr = iconv_substr($str, 0, $length, 'utf-8');
        } else {
            $newstr = substr($str, 0, $length);
        }

        if ($append && $str != $newstr) {
            $newstr .= '...';
        }

        return $newstr;
    }
}

//价格格式化
if (!function_exists('int_format')) {
    function int_format($val)
    {
        return intval(number_format($val, 2, ".", ""));
    }
}

//建目录
if (!function_exists('mkpdir')) {
    function mkpdir($dir, $level = 0)
    {
        $dirarr = explode("/", $dir);
        $dir = "";
        $count = count($dirarr);
        if ($level < 1) {
            $level = $level + $count;
        }
        foreach ($dirarr as &$v) {
            $dir .= $v . "/";
            if ($level == 0) break;
            if (!is_dir($dir)) {
                @mkdir($dir, 0775);
            }
            $level--;
        }

        return $dir;
    }
}


if (!function_exists('filterJSON')) {
    //把会导致json_decode失败的特殊字符替换成空，例子：长乐�无求
    function filterJSON($data, $br = false)
    {
        if ($br) {
            $data = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]' .
                '|[\x00-\x7F][\x80-\xBF]+' .
                '|\n+' .
                '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*' .
                '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})' .
                '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
                '', $data);
        } else {
            $data = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]' .
                '|[\x00-\x7F][\x80-\xBF]+' .
                '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*' .
                '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})' .
                '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
                '', $data);
        }
        $data = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]' .
            '|\xED[\xA0-\xBF][\x80-\xBF]/S', '', $data);

        return $data;
    }
}

if (!function_exists('get_env_array')) {
    function get_env_array($_key, $_is_rand = false)
    {
        $value = env($_key);
        if (!is_null($value)) {
            $value = explode(',', $value);
            if ($_is_rand) {
                shuffle($value);
            }
        }

        return $value;
    }
}

/**
 * @获取数组中指定的值
 * @$dataArray 密文字符串
 * @$key 密钥
 * @return string
 *
 */
if (!function_exists('getArrayValues')) {
    function getArrayValues($keys, $keyName, $array)
    {
        foreach ($array as $key => $value) {
            if (!in_array($value[$keyName], $keys)) {
                unset($array[$key]);
            }
        }
        return $array;
    }
}

/**
 * @判断数组中是否有某个值
 * @$keyValue 键值
 * @$keyName 键名
 * @$array 数组
 * @return string
 *
 */
if (!function_exists('ifArrayExistValue')) {
    function ifArrayExistValue($keyValue, $keyName, $array)
    {
        $temp = [];
        foreach ($array as $key => $value) {
            $temp[] = $value[$keyName];
        }
        if (in_array($keyValue, $temp)) {
            return true;
        } else {
            return false;
        }

    }
}

/**
 * @将对象转化为数组
 * @$obj
 *
 */
if (!function_exists('objectToArray')) {
    function objectToArray($obj)
    {
        $arr = is_object($obj) ? get_object_vars($obj) : $obj;
        if (is_array($arr)) {
            return array_map(__FUNCTION__, $arr);
        } else {
            return $arr;
        }
    }
}

/**
 * @打印
 * @$obj
 *
 */
if (!function_exists('dump')) {
    function dump($obj)
    {
        echo "<pre>";
        var_dump($obj);
        exit;
    }
}

if (!function_exists('is_https')) {
    function is_https()
    {
        if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
            return true;
        } elseif (!empty($_SERVER['HTTP_X_CLIENT_PROTO']) && $_SERVER['HTTP_X_CLIENT_PROTO'] === 'https') {
            return true;
        } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            return true;
        } elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
            return true;
        }

        return false;
    }
}

/**
 * 数组/对象 转成 map
 * add by zhangmiao
 */
if (!function_exists('result_to_map')) {
    function result_to_map($result, $field = 'id')
    {
        $map = array();
        if (!$result || !is_array($result)) {
            return $map;
        }

        foreach ($result as $entry) {
            if (is_array($entry)) {
                $map[$entry[$field]] = $entry;
            } else {
                $map[$entry->$field] = $entry;
            }
        }
        return $map;
    }
}

/**
 * 用key对应的值重组为数组
 * add by zhangmiao
 */
if (!function_exists('result_to_array')) {
    function result_to_array($result, $field = 'id')
    {
        $ary = array();
        if (!$result || !is_array($result)) {
            return $ary;
        }

        foreach ($result as $entry) {
            if (is_array($entry)) {
                $ary[] = $entry[$field];
            } else if (is_object($entry)) {
                $ary[] = $entry->$field;
            }
        }
        return $ary;
    }
}

if (!function_exists('fenToYuan')) {
    /**
     * 金额分转元
     * 转化金额 100010分  ->   1000.10 元
     * @param $money
     * @return string
     */
    function fenToYuan($money)
    {
        if (empty($money)) {
            return 0;
        }
        $res = bcdiv($money, BaseConst::PRICEUNIT, 2);
        return $money % 100 == 0 ? (int)$res : $res;
    }
}

if (!function_exists('convert2cents')) {
    /**
     * 金额元转分
     * 转化金额 1000.10 元  ->   100010分
     * @param $money
     * @return int
     */
    function convert2cents($money)
    {
        return (int)bcmul($money, BaseConst::PRICEUNIT);
    }
}


if (!function_exists('arraySum')) {
    function arraySum($array1, $array2)
    {
        return $array1 + $array2;
    }
}

if (!function_exists('mb_trim')) {

    function mb_trim($string, $trim_chars = '\s')
    {
        return preg_replace('/^[' . $trim_chars . ']*(?U)(.*)[' . $trim_chars . ']*$/u', '\\1', $string);
    }
}

if (!function_exists('resultMsg')) {

    /**
     * 返回信息
     * @param int $code 编号
     * @param object $msg 信息
     * @return \App\Utils\result
     */
    function resultMsg($code = \App\ConstDir\ErrorConst::SUCCESS_CODE, $msg = null)
    {
        return new \App\Utils\result($code, $msg);
    }
}

